── Attaching core tidyverse packages ──────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.4.4 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2 ── Conflicts ────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errorsLoading required package: viridisLite
To calculate the allele frequencies, I began with the bcf output from
mega-post-bcf-exploratory-snakeflow so that the data has gone through
all our normal filtering steps. The basic steps are to get the genotype
likelihoods, convert the bcf to a vcf and subset by population, and then
calculate the allele frequencies using angsd.
mamba activate bcftools1.15 #load in bcftools environment
bcftools +tag2tag main.bcf -- -r -PL-to-GL > genolikes.bcf # converts the FORMAT/PL source tag to FORMAT/GL, since angsd needs the tag
bcftools view genolikes.bcf -S sample_subset.txt -O v -o subset_genolikes.vcf # given the list of samples, subsets and saves as a vcf
angsd -vcf-gl subset_genolikes.vcf -fai genome.fasta.fai -nind 10 -domaf 3 -out angsd_outputs/subset # angsd calculates the minor allele frequencies based on an assumed known major and minor allele but takes the uncertainty of the minor allele into account (-domaf 3) and the number of individuals in changed based on how many you have (this can be grabbed with a quick wc -l)
Now we use the .mafs.gz outputs of angsd for our plots. What makes
these version 2 is that the first time I calculated allele frequencies
with the corrected metadata (and thus the larger Mid-Atlantic group), I
did it from the mega-non-model-wgs-snakeflow bcf (which is filtered
less).
In Eric’s example, he filtered by 30 for 64 individuals, so you can
play with how heavily you want to filter the data. For this, I prefer
70-85% and typically choose 80% and always round down. Having a higher
number of individuals have information at that region makes me more sure
of the results, but it might be reasonable to start at 50% or so just to
check it out before stricter filtering.
Now, we do the comparisons:
natla_mida <- inner_join(natla_freqs,
mida_freqs,
by = c("chromo", "position"),
suffix = c("_n", "_m")) %>% # joins together the northern and mid-atlantic allele frequencies by the chromosome and position, keeping the observations that match and keeps the calculated values separate
mutate(ave_freq = (unknownEM_n + unknownEM_m) / 2, # the average frequency from -domaf 3
abs_diff = abs(unknownEM_n - unknownEM_m)) # the absolute difference in those frequencies
natla_grtl <- inner_join(natla_freqs,
grtl_freqs,
by = c("chromo", "position"),
suffix = c("_n", "_g")) %>%
mutate(ave_freq = (unknownEM_n + unknownEM_g) / 2,
abs_diff = abs(unknownEM_n - unknownEM_g))
mida_grtl <- inner_join(mida_freqs,
grtl_freqs,
by = c("chromo", "position"),
suffix = c("_m", "_g")) %>%
mutate(ave_freq = (unknownEM_m + unknownEM_g) / 2,
abs_diff = abs(unknownEM_m - unknownEM_g))
natla_finl <- inner_join(natla_freqs,
finl_freqs,
by = c("chromo", "position"),
suffix = c("_n", "_f")) %>%
mutate(ave_freq = (unknownEM_n + unknownEM_f) / 2,
abs_diff = abs(unknownEM_n - unknownEM_f))
mida_finl <- inner_join(mida_freqs,
finl_freqs,
by = c("chromo", "position"),
suffix = c("_m", "_f")) %>%
mutate(ave_freq = (unknownEM_m + unknownEM_f) / 2,
abs_diff = abs(unknownEM_m - unknownEM_f))
Now I’m going to check the distribution of our data to make plotting
it easier, and pick a cutoff that will retain most of the
information.
nxm_check <- ggplot(data = natla_mida,
mapping = aes(x = ave_freq,
y = abs_diff)) +
geom_hex(binwidth = 0.001) +
scale_fill_viridis_c()
nxm_check
nxg_check <- ggplot(data = natla_grtl,
mapping = aes(ave_freq,
y = abs_diff)) +
geom_hex(binwidth = 0.001) +
scale_fill_viridis_c()
nxg_check
mxg_check <- ggplot(mida_grtl,
mapping = aes(x = ave_freq,
y = abs_diff)) +
geom_hex(binwidth = 0.001) +
scale_fill_viridis_c()
mxg_check
nxf_check <- ggplot(natla_finl,
mapping = aes(x = ave_freq,
y = abs_diff)) +
geom_hex(binwidth = 0.001) +
scale_fill_viridis_c()
nxf_check
mxf_check <- ggplot(mida_finl,
mapping = aes(x = ave_freq,
y = abs_diff)) +
geom_hex(binwidth = 0.001) +
scale_fill_viridis_c()
mxf_check
I want to try to keep this in the same range as a 50,000 size sliding
window, so I’m going to filter my data for an absolute difference
greater than 0.15
Then I set up the data for plotting by getting the center position of
each chromosome, so that the labels are centered on each chromosome and
not repeated.
Finally, I plot the absolute differences of the allele frequencies
across the entire genome, focusing on the sections that the pairwise fst
analysis showed peaks in fst value.
Starting with the Northern Atlantic versus the Mid-Atlantic
Populations







Northern Atlantic versus the Great Lakes Populations
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Mid-Atlantic versus the Great Lakes Populations
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Northern Atlantic versus the Finger Lakes Populations
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Mid-Atlantic versus the Finger Lakes Populations
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument
There isn’t anything popping up other than the big spike on
chromosome 2, even though we see some spikes above 0.25 in Fst on some
of the other chromosomes. Let’s just compare the spike regions for
chromosome 2.
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) :
invalid first argument

Success! We’re seeing the same spike in absolute difference of allele
frequency in the Mid-Atlantic populations when compared the either Great
Lakes or Finger Lakes that we see in the Northern Atlantic vs
Mid-Atlantic comparison. Because the allele frequencies aren’t very
different between the Northern Atlantic and Great/Finger Lakes at that
highly variable site, it looks like the alewife from Northern Atlantic
populations (Miramichi and Saco River) may have been the source
population for the Great Lakes and the Finger Lakes.
Testing out the differences between Great Lakes and Finger Lakes,
which group pretty strongly together in PCA.
LS0tCnRpdGxlOiAiR2Vub21lLXdpZGUgQWxsZWxlIEZyZXF1ZW5jaWVzIgpzdWJ0aXRsZTogIkFsZXdpZmUgUG9wdWxhdGlvbnMgb2YgSW50ZXJlc3QgU3Vic2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBsaWJyYXJpZXMsIGVjaG8gPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShnZ3RleHQpCmBgYApUbyBjYWxjdWxhdGUgdGhlIGFsbGVsZSBmcmVxdWVuY2llcywgSSBiZWdhbiB3aXRoIHRoZSBiY2Ygb3V0cHV0IGZyb20gbWVnYS1wb3N0LWJjZi1leHBsb3JhdG9yeS1zbmFrZWZsb3cgc28gdGhhdCB0aGUgZGF0YSBoYXMgZ29uZSB0aHJvdWdoIGFsbCBvdXIgbm9ybWFsIGZpbHRlcmluZyBzdGVwcy4gVGhlIGJhc2ljIHN0ZXBzIGFyZSB0byBnZXQgdGhlIGdlbm90eXBlIGxpa2VsaWhvb2RzLCBjb252ZXJ0IHRoZSBiY2YgdG8gYSB2Y2YgYW5kIHN1YnNldCBieSBwb3B1bGF0aW9uLCBhbmQgdGhlbiBjYWxjdWxhdGUgdGhlIGFsbGVsZSBmcmVxdWVuY2llcyB1c2luZyBhbmdzZC4gCgpgYGB7YmFzaCwgZXZhbCA9IEZBTFNFfQptYW1iYSBhY3RpdmF0ZSBiY2Z0b29sczEuMTUgI2xvYWQgaW4gYmNmdG9vbHMgZW52aXJvbm1lbnQKYmNmdG9vbHMgK3RhZzJ0YWcgbWFpbi5iY2YgLS0gLXIgLVBMLXRvLUdMID4gZ2Vub2xpa2VzLmJjZiAjIGNvbnZlcnRzIHRoZSBGT1JNQVQvUEwgc291cmNlIHRhZyB0byBGT1JNQVQvR0wsIHNpbmNlIGFuZ3NkIG5lZWRzIHRoZSB0YWcKYmNmdG9vbHMgdmlldyBnZW5vbGlrZXMuYmNmIC1TIHNhbXBsZV9zdWJzZXQudHh0IC1PIHYgLW8gc3Vic2V0X2dlbm9saWtlcy52Y2YgIyBnaXZlbiB0aGUgbGlzdCBvZiBzYW1wbGVzLCBzdWJzZXRzIGFuZCBzYXZlcyBhcyBhIHZjZgphbmdzZCAtdmNmLWdsIHN1YnNldF9nZW5vbGlrZXMudmNmIC1mYWkgZ2Vub21lLmZhc3RhLmZhaSAtbmluZCAxMCAtZG9tYWYgMyAtb3V0IGFuZ3NkX291dHB1dHMvc3Vic2V0ICMgYW5nc2QgY2FsY3VsYXRlcyB0aGUgbWlub3IgYWxsZWxlIGZyZXF1ZW5jaWVzIGJhc2VkIG9uIGFuIGFzc3VtZWQga25vd24gbWFqb3IgYW5kIG1pbm9yIGFsbGVsZSBidXQgdGFrZXMgdGhlIHVuY2VydGFpbnR5IG9mIHRoZSBtaW5vciBhbGxlbGUgaW50byBhY2NvdW50ICgtZG9tYWYgMykgYW5kIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgaW4gY2hhbmdlZCBiYXNlZCBvbiBob3cgbWFueSB5b3UgaGF2ZSAodGhpcyBjYW4gYmUgZ3JhYmJlZCB3aXRoIGEgcXVpY2sgd2MgLWwpCmBgYAoKTm93IHdlIHVzZSB0aGUgLm1hZnMuZ3ogb3V0cHV0cyBvZiBhbmdzZCBmb3Igb3VyIHBsb3RzLgpXaGF0IG1ha2VzIHRoZXNlIHZlcnNpb24gMiBpcyB0aGF0IHRoZSBmaXJzdCB0aW1lIEkgY2FsY3VsYXRlZCBhbGxlbGUgZnJlcXVlbmNpZXMgd2l0aCB0aGUgY29ycmVjdGVkIG1ldGFkYXRhIChhbmQgdGh1cyB0aGUgbGFyZ2VyIE1pZC1BdGxhbnRpYyBncm91cCksIEkgZGlkIGl0IGZyb20gdGhlIG1lZ2Etbm9uLW1vZGVsLXdncy1zbmFrZWZsb3cgYmNmICh3aGljaCBpcyBmaWx0ZXJlZCBsZXNzKS4KCmBgYHtyIHJlYWRfYW5kX2ZpbHRlcl9kYXRhLCBlY2hvID0gRkFMU0V9CmdydGxfZnJlcXMgPC0gcmVhZF90c3YoImRhdGEvYWxsZWxlX2ZyZXFzL0dSVEwtdjIubWFmcyIsIAogICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JSAjcmVhZCBpbiBHcmVhdCBMYWtlcyBhbGxlbGUgZnJlcXVlbmNpZXMKICBmaWx0ZXIobkluZCA+PSAyMSkgIyBmaWx0ZXIgc28gdGhhdCBhdCBsZWFzdCA4MCUgb2YgaW5kaXZpZHVhbHMgaGF2ZSByZWFkcyBhdCBhIHNpdGUKZmlubF9mcmVxcyA8LSByZWFkX3RzdigiZGF0YS9hbGxlbGVfZnJlcXMvRklOTC12Mi5tYWZzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkgJT4lICMgcmVhZCBpbiBGaW5nZXIgTGFrZXMgYWxsZWxlIGZyZXF1ZW5jaWVzCiAgZmlsdGVyKG5JbmQgPj0gMTMpCm5hdGxhX2ZyZXFzIDwtIHJlYWRfdHN2KCJkYXRhL2FsbGVsZV9mcmVxcy9OQVRMQS12Mi5tYWZzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JSAjIHJlYWQgaW4gTm9ydGhlcm4gQXRsYW50aWMgQW5hZHJvbW91cyBhbGxlbGUgZnJlcXVlbmNpZXMKICBmaWx0ZXIobkluZCA+PSA2KQptaWRhX2ZyZXFzIDwtIHJlYWRfdHN2KCJkYXRhL2FsbGVsZV9mcmVxcy9NSURBLXYyLm1hZnMiLCAKICAgICAgICAgICAgICAgICAgICAgICBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAlPiUgIyByZWFkIGluIE1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIGFsbGVsZSBmcmVxdWVuY2llcwogIGZpbHRlcihuSW5kID49IDEyKQpgYGAKCkluIEVyaWMncyBleGFtcGxlLCBoZSBmaWx0ZXJlZCBieSAzMCBmb3IgNjQgaW5kaXZpZHVhbHMsIHNvIHlvdSBjYW4gcGxheSB3aXRoIGhvdyBoZWF2aWx5IHlvdSB3YW50IHRvIGZpbHRlciB0aGUgZGF0YS4gRm9yIHRoaXMsIEkgcHJlZmVyIDcwLTg1JSBhbmQgdHlwaWNhbGx5IGNob29zZSA4MCUgYW5kIGFsd2F5cyByb3VuZCBkb3duLiBIYXZpbmcgYSBoaWdoZXIgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGhhdmUgaW5mb3JtYXRpb24gYXQgdGhhdCByZWdpb24gbWFrZXMgbWUgbW9yZSBzdXJlIG9mIHRoZSByZXN1bHRzLCBidXQgaXQgbWlnaHQgYmUgcmVhc29uYWJsZSB0byBzdGFydCBhdCA1MCUgb3Igc28ganVzdCB0byBjaGVjayBpdCBvdXQgYmVmb3JlIHN0cmljdGVyIGZpbHRlcmluZy4gCgpOb3csIHdlIGRvIHRoZSBjb21wYXJpc29uczoKYGBge3IgY29tcHN9Cm5hdGxhX21pZGEgPC0gaW5uZXJfam9pbihuYXRsYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgICBtaWRhX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY2hyb21vIiwgInBvc2l0aW9uIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX24iLCAiX20iKSkgJT4lICMgam9pbnMgdG9nZXRoZXIgdGhlIG5vcnRoZXJuIGFuZCBtaWQtYXRsYW50aWMgYWxsZWxlIGZyZXF1ZW5jaWVzIGJ5IHRoZSBjaHJvbW9zb21lIGFuZCBwb3NpdGlvbiwga2VlcGluZyB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgbWF0Y2ggYW5kIGtlZXBzIHRoZSBjYWxjdWxhdGVkIHZhbHVlcyBzZXBhcmF0ZQogIG11dGF0ZShhdmVfZnJlcSA9ICh1bmtub3duRU1fbiArIHVua25vd25FTV9tKSAvIDIsICMgdGhlIGF2ZXJhZ2UgZnJlcXVlbmN5IGZyb20gLWRvbWFmIDMKICAgICAgICAgYWJzX2RpZmYgPSBhYnModW5rbm93bkVNX24gLSB1bmtub3duRU1fbSkpICMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgaW4gdGhvc2UgZnJlcXVlbmNpZXMKCm5hdGxhX2dydGwgPC0gaW5uZXJfam9pbihuYXRsYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgICBncnRsX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY2hyb21vIiwgInBvc2l0aW9uIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX24iLCAiX2ciKSkgJT4lCiAgbXV0YXRlKGF2ZV9mcmVxID0gKHVua25vd25FTV9uICsgdW5rbm93bkVNX2cpIC8gMiwgCiAgICAgICAgIGFic19kaWZmID0gYWJzKHVua25vd25FTV9uIC0gdW5rbm93bkVNX2cpKQoKbWlkYV9ncnRsIDwtIGlubmVyX2pvaW4obWlkYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgIGdydGxfZnJlcXMsIAogICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoImNocm9tbyIsICJwb3NpdGlvbiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX20iLCAiX2ciKSkgJT4lCiAgbXV0YXRlKGF2ZV9mcmVxID0gKHVua25vd25FTV9tICsgdW5rbm93bkVNX2cpIC8gMiwgCiAgICAgICAgIGFic19kaWZmID0gYWJzKHVua25vd25FTV9tIC0gdW5rbm93bkVNX2cpKQoKbmF0bGFfZmlubCA8LSBpbm5lcl9qb2luKG5hdGxhX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmxfZnJlcXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjaHJvbW8iLCAicG9zaXRpb24iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCJfbiIsICJfZiIpKSAlPiUKICBtdXRhdGUoYXZlX2ZyZXEgPSAodW5rbm93bkVNX24gKyB1bmtub3duRU1fZikgLyAyLAogICAgICAgICBhYnNfZGlmZiA9IGFicyh1bmtub3duRU1fbiAtIHVua25vd25FTV9mKSkKbWlkYV9maW5sIDwtIGlubmVyX2pvaW4obWlkYV9mcmVxcywgCiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5sX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiY2hyb21vIiwgInBvc2l0aW9uIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiX20iLCAiX2YiKSkgJT4lCiAgbXV0YXRlKGF2ZV9mcmVxID0gKHVua25vd25FTV9tICsgdW5rbm93bkVNX2YpIC8gMiwKICAgICAgICAgYWJzX2RpZmYgPSBhYnModW5rbm93bkVNX20gLSB1bmtub3duRU1fZikpCmBgYAoKCk5vdyBJJ20gZ29pbmcgdG8gY2hlY2sgdGhlIGRpc3RyaWJ1dGlvbiBvZiBvdXIgZGF0YSB0byBtYWtlIHBsb3R0aW5nIGl0IGVhc2llciwgYW5kIHBpY2sgYSBjdXRvZmYgdGhhdCB3aWxsIHJldGFpbiBtb3N0IG9mIHRoZSBpbmZvcm1hdGlvbi4gCmBgYHtyIGhleGFiaW5zLCBldmFsID0gRkFMU0V9Cm54bV9jaGVjayA8LSBnZ3Bsb3QoZGF0YSA9IG5hdGxhX21pZGEsIAogICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGF2ZV9mcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21faGV4KGJpbndpZHRoID0gMC4wMDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpCm54bV9jaGVjawoKbnhnX2NoZWNrIDwtIGdncGxvdChkYXRhID0gbmF0bGFfZ3J0bCwgCiAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyhhdmVfZnJlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9oZXgoYmlud2lkdGggPSAwLjAwMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkKbnhnX2NoZWNrCgpteGdfY2hlY2sgPC0gZ2dwbG90KG1pZGFfZ3J0bCwgCiAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gYXZlX2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9oZXgoYmlud2lkdGggPSAwLjAwMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkKbXhnX2NoZWNrCgpueGZfY2hlY2sgPC0gZ2dwbG90KG5hdGxhX2ZpbmwsIAogICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGF2ZV9mcmVxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX2hleChiaW53aWR0aCA9IDAuMDAxKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoKQpueGZfY2hlY2sKCm14Zl9jaGVjayA8LSBnZ3Bsb3QobWlkYV9maW5sLCAKICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBhdmVfZnJlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9oZXgoYmlud2lkdGggPSAwLjAwMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkKbXhmX2NoZWNrCmBgYApJIHdhbnQgdG8gdHJ5IHRvIGtlZXAgdGhpcyBpbiB0aGUgc2FtZSByYW5nZSBhcyBhIDUwLDAwMCBzaXplIHNsaWRpbmcgd2luZG93LCBzbyBJJ20gZ29pbmcgdG8gZmlsdGVyIG15IGRhdGEgZm9yIGFuIGFic29sdXRlIGRpZmZlcmVuY2UgZ3JlYXRlciB0aGFuIDAuMTUKYGBge3IgbW9yZV9maWx0ZXJpbmcsIGVjaG8gPSBGQUxTRX0KbmF0bGFfbWlkYSA8LSBuYXRsYV9taWRhICU+JQogIGZpbHRlcihhYnNfZGlmZiA+IDAuMTUpCm5hdGxhX2dydGwgPC0gbmF0bGFfZ3J0bCAlPiUKICBmaWx0ZXIoYWJzX2RpZmYgPiAwLjE1KQptaWRhX2dydGwgPC0gbWlkYV9ncnRsICU+JQogIGZpbHRlcihhYnNfZGlmZiA+IDAuMTUpCm5hdGxhX2ZpbmwgPC0gbmF0bGFfZmlubCAlPiUKICBmaWx0ZXIoYWJzX2RpZmYgPiAwLjE1KQptaWRhX2ZpbmwgPC0gbWlkYV9maW5sICU+JQogIGZpbHRlcihhYnNfZGlmZiA+IDAuMTUpCmBgYAoKVGhlbiBJIHNldCB1cCB0aGUgZGF0YSBmb3IgcGxvdHRpbmcgYnkgZ2V0dGluZyB0aGUgY2VudGVyIHBvc2l0aW9uIG9mIGVhY2ggY2hyb21vc29tZSwgc28gdGhhdCB0aGUgbGFiZWxzIGFyZSBjZW50ZXJlZCBvbiBlYWNoIGNocm9tb3NvbWUgYW5kIG5vdCByZXBlYXRlZC4gCmBgYHtyIG1vcmVfZGF0YV9vcmcsIGVjaG8gPSBGQUxTRX0KZGF0YV9jdW0gPC0gbmF0bGFfbWlkYSAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShtYXhfcG9zID0gbWF4KHBvc2l0aW9uKSkgJT4lCiAgbXV0YXRlKHBvc19hZGQgPSBsYWcoY3Vtc3VtKG1heF9wb3MpLCBkZWZhdWx0ID0gMCkpICU+JQogIHNlbGVjdChjaHJvbW8sIHBvc19hZGQpCm5hdGxhX21pZGEgPC0gbmF0bGFfbWlkYSAlPiUKICBpbm5lcl9qb2luKGRhdGFfY3VtLCBieSA9ICJjaHJvbW8iKSAlPiUKICBtdXRhdGUocG9zX2N1bSA9IHBvc2l0aW9uICsgcG9zX2FkZCkKbnhtX2F4aXNfc2V0IDwtIG5hdGxhX21pZGEgJT4lCiAgZ3JvdXBfYnkoY2hyb21vKSAlPiUKICBzdW1tYXJpc2UoY2VudGVyID0gbWVhbihwb3NfY3VtKSkKCmRhdGFfY3VtIDwtIG5hdGxhX2dydGwgJT4lCiAgZ3JvdXBfYnkoY2hyb21vKSAlPiUKICBzdW1tYXJpc2UobWF4X3BvcyA9IG1heChwb3NpdGlvbikpICU+JQogIG11dGF0ZShwb3NfYWRkID0gbGFnKGN1bXN1bShtYXhfcG9zKSwgZGVmYXVsdCA9IDApKSAlPiUKICBzZWxlY3QoY2hyb21vLCBwb3NfYWRkKQpuYXRsYV9ncnRsIDwtIG5hdGxhX2dydGwgJT4lCiAgaW5uZXJfam9pbihkYXRhX2N1bSwgYnkgPSAiY2hyb21vIikgJT4lCiAgbXV0YXRlKHBvc19jdW0gPSBwb3NpdGlvbiArIHBvc19hZGQpCm54Z19heGlzX3NldCA8LSBuYXRsYV9ncnRsICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKGNlbnRlciA9IG1lYW4ocG9zX2N1bSkpCgpkYXRhX2N1bSA8LSBtaWRhX2dydGwgJT4lCiAgZ3JvdXBfYnkoY2hyb21vKSAlPiUKICBzdW1tYXJpc2UobWF4X3BvcyA9IG1heChwb3NpdGlvbikpICU+JQogIG11dGF0ZShwb3NfYWRkID0gbGFnKGN1bXN1bShtYXhfcG9zKSwgZGVmYXVsdCA9IDApKSAlPiUKICBzZWxlY3QoY2hyb21vLCBwb3NfYWRkKQptaWRhX2dydGwgPC0gbWlkYV9ncnRsICU+JQogIGlubmVyX2pvaW4oZGF0YV9jdW0sIGJ5ID0gImNocm9tbyIpICU+JQogIG11dGF0ZShwb3NfY3VtID0gcG9zaXRpb24gKyBwb3NfYWRkKQpteGdfYXhpc19zZXQgPC0gbWlkYV9ncnRsICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKGNlbnRlciA9IG1lYW4ocG9zX2N1bSkpCgpkYXRhX2N1bSA8LSBuYXRsYV9maW5sICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgocG9zaXRpb24pKSAlPiUKICBtdXRhdGUocG9zX2FkZCA9IGxhZyhjdW1zdW0obWF4X3BvcyksIGRlZmF1bHQgPSAwKSkgJT4lCiAgc2VsZWN0KGNocm9tbywgcG9zX2FkZCkKbmF0bGFfZmlubCA8LSBuYXRsYV9maW5sICU+JQogIGlubmVyX2pvaW4oZGF0YV9jdW0sIGJ5ID0gImNocm9tbyIpICU+JQogIG11dGF0ZShwb3NfY3VtID0gcG9zaXRpb24gKyBwb3NfYWRkKQpueGZfYXhpc19zZXQgPC0gbmF0bGFfZmlubCAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShjZW50ZXIgPSBtZWFuKHBvc19jdW0pKQoKZGF0YV9jdW0gPC0gbWlkYV9maW5sICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgocG9zaXRpb24pKSAlPiUKICBtdXRhdGUocG9zX2FkZCA9IGxhZyhjdW1zdW0obWF4X3BvcyksIGRlZmF1bHQgPSAwKSkgJT4lCiAgc2VsZWN0KGNocm9tbywgcG9zX2FkZCkKbWlkYV9maW5sIDwtIG1pZGFfZmlubCAlPiUKICBpbm5lcl9qb2luKGRhdGFfY3VtLCBieSA9ICJjaHJvbW8iKSAlPiUKICBtdXRhdGUocG9zX2N1bSA9IHBvc2l0aW9uICsgcG9zX2FkZCkKbXhmX2F4aXNfc2V0IDwtIG1pZGFfZmlubCAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShjZW50ZXIgPSBtZWFuKHBvc19jdW0pKQpgYGAKCkZpbmFsbHksIEkgcGxvdCB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgb2YgdGhlIGFsbGVsZSBmcmVxdWVuY2llcyBhY3Jvc3MgdGhlIGVudGlyZSBnZW5vbWUsIGZvY3VzaW5nIG9uIHRoZSBzZWN0aW9ucyB0aGF0IHRoZSBwYWlyd2lzZSBmc3QgYW5hbHlzaXMgc2hvd2VkIHBlYWtzIGluIGZzdCB2YWx1ZS4KClN0YXJ0aW5nIHdpdGggdGhlIE5vcnRoZXJuIEF0bGFudGljIHZlcnN1cyB0aGUgTWlkLUF0bGFudGljIFBvcHVsYXRpb25zCmBgYHtyIG5vcnRoeG1pZF9hdGxfcGxvdCwgZWNobyA9IEZBTFNFfQpueG1fcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG5hdGxhX21pZGEsCiAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocm9tbykpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhtX2F4aXNfc2V0JGNocm9tbywKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhtX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmVwKGMoIiMyNDJiMzUiLCAiIzg2OWNhOCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChueG1fYXhpc19zZXQkY2hyb21vKSkpKSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIHZzLiBNaWQtQXRsYW50aWMgQW5hZHJvbW91cyBBbGV3aWZlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9wbG90CgojIyMgQ2hyb21vc29tZXMgb2YgSW50ZXJlc3QgIyMjCm54bV9jaHIxX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfbWlkYSwgY2hyb21vID09ICJOQ18wNTU5NTcuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54bV9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueG1fYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyB2cy4gTWlkLUF0bGFudGljIEFuYWRyb21vdXMgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9jaHIxX3Bsb3QKCm54bV9jaHIyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfbWlkYSwgY2hyb21vID09ICJOQ18wNTU5NTguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjODY5Y2E4IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54bV9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueG1fYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyB2cy4gTWlkLUF0bGFudGljIEFuYWRyb21vdXMgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9jaHIyX3Bsb3QKCm54bV9jaHIzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfbWlkYSwgY2hyb21vID09ICJOQ18wNTU5NTkuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54bV9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueG1fYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyB2cy4gTWlkLUF0bGFudGljIEFuYWRyb21vdXMgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54bV9jaHIzX3Bsb3QKCm54bV9jaHIxMF9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX21pZGEsIGNocm9tbyA9PSAiTkNfMDU1OTY2LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueG1fYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhtX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgdnMuIE1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhtX2NocjEwX3Bsb3QKCm54bV9jaHIxMl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX21pZGEsIGNocm9tbyA9PSAiTkNfMDU1OTY4LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueG1fYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhtX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgdnMuIE1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhtX2NocjEyX3Bsb3QKCiMjIyBDaHJvbW9zb21lIDIgU3Bpa2UgUmVnaW9uICMjIwoKbnhtX3NwaWtlX3Bsb3QgPC0gbmF0bGFfbWlkYSAlPiUKICBmaWx0ZXIoY2hyb21vID09ICJOQ18wNTU5NTguMSIpICU+JQogIGZpbHRlcihwb3NpdGlvbiA+PSAxNjYwMDAwMCkgJT4lCiAgZmlsdGVyKHBvc2l0aW9uIDw9IDE3MDAwMDAwKSAlPiUKICBnZ3Bsb3QoLiwKICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgY29sb3IgPSAiIzg2OWNhOCIsIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSAiUG9zaXRpb24iLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgdnMgTi4gQXRsYW50aWMgQW5hZHJvbW91cyBBbGV3aWZlIENocm9tb3NvbWUgMiIsIAogICAgICAgc3VidGl0bGUgPSAiMTY2MDAwMDAuLjE3MDAwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCgpueG1fc3Bpa2VfcGxvdApgYGAKTm9ydGhlcm4gQXRsYW50aWMgdmVyc3VzIHRoZSBHcmVhdCBMYWtlcyBQb3B1bGF0aW9ucwpgYGB7ciBub3J0aHhncmVhdF9wbG90LCBlY2hvID0gRkFMU0V9Cm54Z19wbG90IDwtIGdncGxvdChkYXRhID0gbmF0bGFfZ3J0bCwKICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhc19mYWN0b3IoY2hyb21vKSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueGdfYXhpc19zZXQkY2hyb21vLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXAoYygiIzI0MmIzNSIsICIjODY5Y2E4IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUobGVuZ3RoKG54Z19heGlzX3NldCRjaHJvbW8pKSkpICsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgQW5hZHJvbW91cyB2cy4gR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54Z19wbG90CgojIyMgQ2hyb21vc29tZXMgb2YgSW50ZXJlc3QgIyMjCm54Z19jaHIxX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NTcuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54Z19jaHIxX3Bsb3QKCm54Z19jaHIyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NTguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjODY5Y2E4IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54Z19jaHIyX3Bsb3QKCm54Z19jaHIzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NTkuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54Z19jaHIzX3Bsb3QKCm54Z19jaHIxMF9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX2dydGwsIGNocm9tbyA9PSAiTkNfMDU1OTY2LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueGdfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhnX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhnX2NocjEwX3Bsb3QKCm54Z19jaHIxMl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX2dydGwsIGNocm9tbyA9PSAiTkNfMDU1OTY4LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueGdfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhnX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhnX2NocjEyX3Bsb3QKCiMjIyBDaHJvbW9zb21lIDIgU3Bpa2UgUmVnaW9uICMjIwoKbnhnX3NwaWtlX3Bsb3QgPC0gbmF0bGFfZ3J0bCAlPiUKICBmaWx0ZXIoY2hyb21vID09ICJOQ18wNTU5NTguMSIpICU+JQogIGZpbHRlcihwb3NpdGlvbiA+PSAxNjYwMDAwMCkgJT4lCiAgZmlsdGVyKHBvc2l0aW9uIDw9IDE3MDAwMDAwKSAlPiUKICBnZ3Bsb3QoLiwKICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgY29sb3IgPSAiIzg2OWNhOCIsIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSAiUG9zaXRpb24iLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSBDaHJvbW9zb21lIDIiLCAKICAgICAgIHN1YnRpdGxlID0gIjE2NjAwMDAwLi4xNzAwMDAwMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpueGdfc3Bpa2VfcGxvdApgYGAKTWlkLUF0bGFudGljIHZlcnN1cyB0aGUgR3JlYXQgTGFrZXMgUG9wdWxhdGlvbnMKYGBge3IgbWlkeGdyZWF0X3Bsb3QsIGVjaG8gPSBGQUxTRX0KbXhnX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBtaWRhX2dydGwsCiAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocm9tbykpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbXhnX2F4aXNfc2V0JGNocm9tbywKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbXhnX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmVwKGMoIiMyNDJiMzUiLCAiIzg2OWNhOCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChteGdfYXhpc19zZXQkY2hyb21vKSkpKSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEdyZWF0IExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGdfcGxvdAoKIyMjIENocm9tb3NvbWVzIG9mIEludGVyZXN0ICMjIwpteGdfY2hyMV9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NTcuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGdfY2hyMV9wbG90CgpteGdfY2hyMl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NTguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjODY5Y2E4IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGdfY2hyMl9wbG90CgpteGdfY2hyM19wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZ3J0bCwgY2hyb21vID09ICJOQ18wNTU5NTkuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Z19heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGdfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGdfY2hyM19wbG90CgpteGdfY2hyMTBfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihtaWRhX2dydGwsIGNocm9tbyA9PSAiTkNfMDU1OTY2LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGdfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbXhnX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDEwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Z19jaHIxMF9wbG90CgpteGdfY2hyMTJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihtaWRhX2dydGwsIGNocm9tbyA9PSAiTkNfMDU1OTY4LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGdfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbXhnX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgR3JlYXQgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDEyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Z19jaHIxMl9wbG90CgojIyMgQ2hyb21vc29tZSAyIFNwaWtlIFJlZ2lvbiAjIyMKCm14Z19zcGlrZV9wbG90IDwtIG1pZGFfZ3J0bCAlPiUKICBmaWx0ZXIoY2hyb21vID09ICJOQ18wNTU5NTguMSIpICU+JQogIGZpbHRlcihwb3NpdGlvbiA+PSAxNjYwMDAwMCkgJT4lCiAgZmlsdGVyKHBvc2l0aW9uIDw9IDE3MDAwMDAwKSAlPiUKICBnZ3Bsb3QoLiwKICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgY29sb3IgPSAiIzg2OWNhOCIsIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSAiUG9zaXRpb24iLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUgQ2hyb21vc29tZSAyIiwgCiAgICAgICBzdWJ0aXRsZSA9ICIxNjYwMDAwMC4uMTcwMDAwMDAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKCm14Z19zcGlrZV9wbG90CmBgYApOb3J0aGVybiBBdGxhbnRpYyB2ZXJzdXMgdGhlIEZpbmdlciBMYWtlcyBQb3B1bGF0aW9ucwpgYGB7ciBub3J0aHhmaW5nZXJfcGxvdCwgZWNobyA9IEZBTFNFfQpueGZfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IG5hdGxhX2ZpbmwsCiAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocm9tbykpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhmX2F4aXNfc2V0JGNocm9tbywKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmVwKGMoIiMyNDJiMzUiLCAiIzg2OWNhOCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChueGZfYXhpc19zZXQkY2hyb21vKSkpKSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpueGZfcGxvdAoKIyMjIENocm9tb3NvbWVzIG9mIEludGVyZXN0ICMjIwpueGZfY2hyMV9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG5hdGxhX2ZpbmwsIGNocm9tbyA9PSAiTkNfMDU1OTU3LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBueGZfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbnhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTi4gQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDEiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhmX2NocjFfcGxvdAoKbnhmX2NocjJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihuYXRsYV9maW5sLCBjaHJvbW8gPT0gIk5DXzA1NTk1OC4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiM4NjljYTgiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhmX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm54Zl9jaHIyX3Bsb3QKCm54Zl9jaHIzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZmlubCwgY2hyb21vID09ICJOQ18wNTU5NTkuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Zl9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpueGZfY2hyM19wbG90CgpueGZfY2hyMTBfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihuYXRsYV9maW5sLCBjaHJvbW8gPT0gIk5DXzA1NTk2Ni4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbnhmX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG54Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk4uIEF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpueGZfY2hyMTBfcGxvdAoKbnhmX2NocjEyX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobmF0bGFfZmlubCwgY2hyb21vID09ICJOQ18wNTU5NjguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG54Zl9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBueGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMTIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbnhmX2NocjEyX3Bsb3QKCiMjIyBDaHJvbW9zb21lIDIgU3Bpa2UgUmVnaW9uICMjIwoKbnhmX3NwaWtlX3Bsb3QgPC0gbmF0bGFfZmlubCAlPiUKICBmaWx0ZXIoY2hyb21vID09ICJOQ18wNTU5NTguMSIpICU+JQogIGZpbHRlcihwb3NpdGlvbiA+PSAxNjYwMDAwMCkgJT4lCiAgZmlsdGVyKHBvc2l0aW9uIDw9IDE3MDAwMDAwKSAlPiUKICBnZ3Bsb3QoLiwKICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgY29sb3IgPSAiIzg2OWNhOCIsIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSAiUG9zaXRpb24iLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJOLiBBdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUgQ2hyb21vc29tZSAyIiwgCiAgICAgICBzdWJ0aXRsZSA9ICIxNjYwMDAwMC4uMTcwMDAwMDAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKYGBgCgpNaWQtQXRsYW50aWMgdmVyc3VzIHRoZSBGaW5nZXIgTGFrZXMgUG9wdWxhdGlvbnMKYGBge3IgbWlkeGZpbmdlcl9wbG90LCBlY2hvID0gRkFMU0V9Cm14Zl9wbG90IDwtIGdncGxvdChkYXRhID0gbWlkYV9maW5sLAogICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzX2ZhY3RvcihjaHJvbW8pKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Zl9heGlzX3NldCRjaHJvbW8sCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG14Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJlcChjKCIjMjQyYjM1IiwgIiM4NjljYTgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZShsZW5ndGgobXhmX2F4aXNfc2V0JGNocm9tbykpKSkgKwogIGxhYnMoeCA9IE5VTEwsCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Zl9wbG90CgojIyMgQ2hyb21vc29tZXMgb2YgSW50ZXJlc3QgIyMjCm14Zl9jaHIxX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobWlkYV9maW5sLCBjaHJvbW8gPT0gIk5DXzA1NTk1Ny4xIiksIAogICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gIiMyNDJiMzUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbXhmX2F4aXNfc2V0JGNocm9tbywgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IG14Zl9heGlzX3NldCRjZW50ZXIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIk1pZC1BdGxhbnRpYyBBbmFkcm9tb3VzIHZzIEZpbmdlciBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGZfY2hyMV9wbG90CgpteGZfY2hyMl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZmlubCwgY2hyb21vID09ICJOQ18wNTU5NTguMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjODY5Y2E4IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Zl9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbXhmX2NocjJfcGxvdAoKbXhmX2NocjNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihtaWRhX2ZpbmwsIGNocm9tbyA9PSAiTkNfMDU1OTU5LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGZfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbXhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Zl9jaHIzX3Bsb3QKCm14Zl9jaHIxMF9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1pZGFfZmlubCwgY2hyb21vID09ICJOQ18wNTU5NjYuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gcG9zX2N1bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICIjMjQyYjM1IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbCA9IG14Zl9heGlzX3NldCRjaHJvbW8sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBteGZfYXhpc19zZXQkY2VudGVyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBsYWJzKHggPSBOVUxMLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwgCiAgICAgICB0aXRsZSA9ICJNaWQtQXRsYW50aWMgQW5hZHJvbW91cyB2cyBGaW5nZXIgTGFrZXMgTGFuZGxvY2tlZCBBbGV3aWZlIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJDaHJvbW9zb21lIDEwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm14Zl9jaHIxMF9wbG90CgpteGZfY2hyMTJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihtaWRhX2ZpbmwsIGNocm9tbyA9PSAiTkNfMDU1OTY4LjEiKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBhYnNfZGlmZikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43NSwgc2l6ZSA9IDAuNSwgY29sb3IgPSAiIzI0MmIzNSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWwgPSBteGZfYXhpc19zZXQkY2hyb21vLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gbXhmX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gTlVMTCwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAxMiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpteGZfY2hyMTJfcGxvdAoKIyMjIENocm9tb3NvbWUgMiBTcGlrZSBSZWdpb24gIyMjCgpteGZfc3Bpa2VfcGxvdCA8LSBtaWRhX2ZpbmwgJT4lCiAgZmlsdGVyKGNocm9tbyA9PSAiTkNfMDU1OTU4LjEiKSAlPiUKICBmaWx0ZXIocG9zaXRpb24gPj0gMTY2MDAwMDApICU+JQogIGZpbHRlcihwb3NpdGlvbiA8PSAxNzAwMDAwMCkgJT4lCiAgZ2dwbG90KC4sCiAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc2l0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIGNvbG9yID0gIiM4NjljYTgiLCBzaXplID0gMikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMTUsIDEuMDUpKSArCiAgbGFicyh4ID0gIlBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkFic29sdXRlIERpZmZlcmVuY2UgaW4gQWxsZWxlIEZyZXF1ZW5jeSIsIAogICAgICAgdGl0bGUgPSAiTWlkLUF0bGFudGljIEFuYWRyb21vdXMgdnMgRmluZ2VyIExha2VzIExhbmRsb2NrZWQgQWxld2lmZSBDaHJvbW9zb21lIDIiLCAKICAgICAgIHN1YnRpdGxlID0gIjE2NjAwMDAwLi4xNzAwMDAwMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjUpKQpgYGAKClRoZXJlIGlzbid0IGFueXRoaW5nIHBvcHBpbmcgdXAgb3RoZXIgdGhhbiB0aGUgYmlnIHNwaWtlIG9uIGNocm9tb3NvbWUgMiwgZXZlbiB0aG91Z2ggd2Ugc2VlIHNvbWUgc3Bpa2VzIGFib3ZlIDAuMjUgaW4gRnN0IG9uIHNvbWUgb2YgdGhlIG90aGVyIGNocm9tb3NvbWVzLiBMZXQncyBqdXN0IGNvbXBhcmUgdGhlIHNwaWtlIHJlZ2lvbnMgZm9yIGNocm9tb3NvbWUgMi4KCmBgYHtyIHNwaWtlX3Bsb3RzLCBlY2hvID0gRkFMU0V9Cm54bV9zcGlrZV9wbG90Cm54Z19zcGlrZV9wbG90Cm14Z19zcGlrZV9wbG90Cm54Zl9zcGlrZV9wbG90Cm14Zl9zcGlrZV9wbG90CmBgYApTdWNjZXNzISBXZSdyZSBzZWVpbmcgdGhlIHNhbWUgc3Bpa2UgaW4gYWJzb2x1dGUgZGlmZmVyZW5jZSBvZiBhbGxlbGUgZnJlcXVlbmN5IGluIHRoZSBNaWQtQXRsYW50aWMgcG9wdWxhdGlvbnMgd2hlbiBjb21wYXJlZCB0aGUgZWl0aGVyIEdyZWF0IExha2VzIG9yIEZpbmdlciBMYWtlcyB0aGF0IHdlIHNlZSBpbiB0aGUgTm9ydGhlcm4gQXRsYW50aWMgdnMgTWlkLUF0bGFudGljIGNvbXBhcmlzb24uIEJlY2F1c2UgdGhlIGFsbGVsZSBmcmVxdWVuY2llcyBhcmVuJ3QgdmVyeSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgTm9ydGhlcm4gQXRsYW50aWMgYW5kIEdyZWF0L0ZpbmdlciBMYWtlcyBhdCB0aGF0IGhpZ2hseSB2YXJpYWJsZSBzaXRlLCBpdCBsb29rcyBsaWtlIHRoZSBhbGV3aWZlIGZyb20gTm9ydGhlcm4gQXRsYW50aWMgcG9wdWxhdGlvbnMgKE1pcmFtaWNoaSBhbmQgU2FjbyBSaXZlcikgbWF5IGhhdmUgYmVlbiB0aGUgc291cmNlIHBvcHVsYXRpb24gZm9yIHRoZSBHcmVhdCBMYWtlcyBhbmQgdGhlIEZpbmdlciBMYWtlcy4gCgpUZXN0aW5nIG91dCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBHcmVhdCBMYWtlcyBhbmQgRmluZ2VyIExha2VzLCB3aGljaCBncm91cCBwcmV0dHkgc3Ryb25nbHkgdG9nZXRoZXIgaW4gUENBLiAKYGBge3IgZmluZ2VyeGdyZWF0X3Rlc3QsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQpmaW5sX2dydGwgPC0gaW5uZXJfam9pbihmaW5sX2ZyZXFzLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGdydGxfZnJlcXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjaHJvbW8iLCAicG9zaXRpb24iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCJfZiIsICJfZyIpKSAlPiUKICBtdXRhdGUoYXZlX2ZyZXEgPSAodW5rbm93bkVNX2YgKyB1bmtub3duRU1fZykgLyAyLCAKICAgICAgICAgYWJzX2RpZmYgPSBhYnModW5rbm93bkVNX2YgLSB1bmtub3duRU1fZykpCgpmeGdfY2hlY2sgPC0gZ2dwbG90KGRhdGEgPSBmaW5sX2dydGwsIAogICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoYXZlX2ZyZXEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21faGV4KGJpbndpZHRoID0gMC4wMDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpCmZ4Z19jaGVjawoKZmlubF9ncnRsIDwtIGZpbmxfZ3J0bCAlPiUKICBmaWx0ZXIoYWJzX2RpZmYgPiAwLjE1KQoKZGF0YV9jdW0gPC0gZmlubF9ncnRsICU+JQogIGdyb3VwX2J5KGNocm9tbykgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgocG9zaXRpb24pKSAlPiUKICBtdXRhdGUocG9zX2FkZCA9IGxhZyhjdW1zdW0obWF4X3BvcyksIGRlZmF1bHQgPSAwKSkgJT4lCiAgc2VsZWN0KGNocm9tbywgcG9zX2FkZCkKZmlubF9ncnRsIDwtIGZpbmxfZ3J0bCAlPiUKICBpbm5lcl9qb2luKGRhdGFfY3VtLCBieSA9ICJjaHJvbW8iKSAlPiUKICBtdXRhdGUocG9zX2N1bSA9IHBvc2l0aW9uICsgcG9zX2FkZCkKZnhnX2F4aXNfc2V0IDwtIGZpbmxfZ3J0bCAlPiUKICBncm91cF9ieShjaHJvbW8pICU+JQogIHN1bW1hcmlzZShjZW50ZXIgPSBtZWFuKHBvc19jdW0pKQoKZnhnX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaW5sX2dydGwsCiAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NfY3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYWJzX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocm9tbykpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gZnhnX2F4aXNfc2V0JGNocm9tbywKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gZnhnX2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMC4xNSwgMS4wNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmVwKGMoIiMyNDJiMzUiLCAiIzg2OWNhOCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChmeGdfYXhpc19zZXQkY2hyb21vKSkpKSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSAiQWJzb2x1dGUgRGlmZmVyZW5jZSBpbiBBbGxlbGUgRnJlcXVlbmN5IiwKICAgICAgIHRpdGxlID0gIkZpbmdlciBMYWtlcyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKZnhnX3Bsb3QKCiMjIyBDaHJvbW9zb21lIDIgU3Bpa2UgUmVnaW9uICMjIwoKZnhnX3NwaWtlX3Bsb3QgPC0gZmlubF9ncnRsICU+JQogIGZpbHRlcihjaHJvbW8gPT0gIk5DXzA1NTk1OC4xIikgJT4lCiAgZmlsdGVyKHBvc2l0aW9uID49IDE2NjAwMDAwKSAlPiUKICBmaWx0ZXIocG9zaXRpb24gPD0gMTcwMDAwMDApICU+JQogIGdncGxvdCguLAogICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBwb3NpdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgeSA9IGFic19kaWZmKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBjb2xvciA9ICIjODY5Y2E4Iiwgc2l6ZSA9IDIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLjE1LCAxLjA1KSkgKwogIGxhYnMoeCA9ICJQb3NpdGlvbiIsIAogICAgICAgeSA9ICJBYnNvbHV0ZSBEaWZmZXJlbmNlIGluIEFsbGVsZSBGcmVxdWVuY3kiLCAKICAgICAgIHRpdGxlID0gIkZpbmdlciBMYWtlcyB2cyBHcmVhdCBMYWtlcyBMYW5kbG9ja2VkIEFsZXdpZmUgQ2hyb21vc29tZSAyIiwgCiAgICAgICBzdWJ0aXRsZSA9ICIxNjYwMDAwMC4uMTcwMDAwMDAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9tYXJrZG93bigpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKZnhnX3NwaWtlX3Bsb3QKYGBgCgpgYGB7ciBzYXZlX3Bsb3RzLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KZ2dzYXZlKCJmaWd1cmVzL2FsbGVsZS1mcmVxcy9uYXRsYS14LWZpbmwtY2hyb20yLXNwaWtlLWFsbGVsZS1mcmVxcy5wbmciLCAKICAgICAgIHBsb3QgPSBueGZfc3Bpa2VfcGxvdCwgCiAgICAgICB3aWR0aCA9IDEwLCAKICAgICAgIGhlaWdodCA9IDQpCmBgYAoK